package co.edu.udea.iw.dao.impl;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import co.edu.udea.iw.dao.PrestamoDAO;
import co.edu.udea.iw.dto.Prestamo;
import co.edu.udea.iw.exception.IWDaoException;

/**
 * Clase que hereda de HibernateDaoSupport e implementa (sobrescribe) los
 * metodos del dao del prestamo
 * 
 * @author Santiago Ruiz
 * @author Bladimir Velez
 *
 */

public class PrestamoDAOImpl extends HibernateDaoSupport implements PrestamoDAO {
	/**
	 * Entrega los datos de un prestamo dado su identificador
	 * 
	 * @param id
	 *            id identificador del prestamo
	 * @return instancia con los datos del prestamo obtenido, si no existe el
	 *         prestamo retorna null.
	 * @throws IWDaoException
	 */
	@Override
	public Prestamo obtenerPrestamo(int idPrestamo) throws IWDaoException {
		Session session = null;
		Prestamo prestamo = null;

		try {
			session = getSession();
			prestamo = (Prestamo) session.get(Prestamo.class, idPrestamo);

		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return prestamo;
	}

	/**
	 * Entrega la lista de todos los prestamos existentes en base de datos
	 * 
	 * @return lista prestamos
	 * @throws IWDaoException
	 */
	@Override
	public List<Prestamo> obtenerPrestamos() throws IWDaoException {
		Session session = null;
		List<Prestamo> prestamos = new ArrayList<Prestamo>();

		try {
			session = getSession();
			Criteria criteria = session.createCriteria(Prestamo.class);
			prestamos = criteria.list();

		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}
		return prestamos;
	}

	/**
	 * Agrega un prestamo
	 * 
	 * @param prestamo
	 *            prestamo a agregar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void agregarPrestamo(Prestamo prestamo) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.save(prestamo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Actualiza un prestamo
	 * 
	 * @param prestamo
	 *            prestamo a actualizar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void actualizarPrestamo(Prestamo prestamo) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.update(prestamo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}

	/**
	 * Elimina un prestamo
	 * 
	 * @param prestamo
	 *            prestamo a eliminar
	 * @return void
	 * @throws IWDaoException
	 */
	@Override
	public void eliminarPrestamo(Prestamo prestamo) throws IWDaoException {
		Session session = null;
		try {
			session = getSession();
			session.beginTransaction();
			session.delete(prestamo);
			session.getTransaction().commit();
		} catch (HibernateException e) {
			throw new IWDaoException(e);
		}

	}
}
